package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pos.domain.Evento;
import pos.domain.EventoActividadGrupo;
import pos.domain.EventoBuscaComponentes;
import pos.domain.EventoBuscaEquipo;
import pos.domain.Lugar;
import pos.domain.Mensaje;
import pos.domain.Usuario;
import pos.utils.UIDGenerator;

public class JDBCEventoDAO implements IEventoDAO {
	//Marta
	List eventos = new ArrayList();
	List habilidades = new ArrayList();
	List usuarios = new ArrayList(); 
	private String oid;
	
	ILugarDAO ldao;
	IMensajeDAO mdao;
	IUsuarioDAO udao;
	IConocidoDAO cdao;
	IInscripcionDAO idao;
	private Connection conn;
	
	public JDBCEventoDAO()
	{
		conn = ConnectionManager.getInstance().checkOut();
		ldao = new JDBCLugarDAO(conn);
		mdao = new JDBCMensajeDAO(conn);
		udao = new JDBCUsuarioDAO(conn);
		cdao = new JDBCConocidoDAO(conn);
		idao = new JDBCInscripcionDAO(conn);
	}
	public JDBCEventoDAO(Connection conn)
	{
		this.conn = conn;
		ldao = new JDBCLugarDAO(conn);
		mdao = new JDBCMensajeDAO(conn);
		udao = new JDBCUsuarioDAO(conn);
		cdao = new JDBCConocidoDAO(conn);
		idao = new JDBCInscripcionDAO(conn);
	}
	
	protected void finalize() {
		ConnectionManager.getInstance().checkIn(conn);
	}
	
	public void addInscripcion(String idUsuario, String eventoid){
		idao = new JDBCInscripcionDAO(conn);
		idao.insertInscripcion(idUsuario, eventoid);
	}
	//Marta
    private void insertEvento (Evento e,String direccion) 
	{
    	 
		oid = UIDGenerator.getInstance().getKey(); 
    	String sql = "INSERT INTO eventos ( OID, titulo, descripcion, fecha_inicio, fecha_fin,limite_inscripciones,genero,cerrado,publico,lugarOID) VALUES (?, ?, ?, ?, ?, ?,?,?,?,?) ";
        PreparedStatement stmt = null;
        
      
        try {
       
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, oid);
            stmt.setString(2, e.getTitulo());
            stmt.setString(3, e.getDescripcion());
            stmt.setString(4, e.getFecha_inicio());
            stmt.setString(5, e.getFecha_fin());
            stmt.setInt(6, e.getLimite_inscripciones());
            stmt.setString(7, e.getGenero());
            stmt.setInt(8, e.getCerrado());
            stmt.setInt(9, e.esPublico());
            stmt.setString(10, ldao.selectLugarOID(direccion));
            stmt.executeUpdate();
            
        } catch (SQLException ex) {
        	
            System.out.println("Mensaje de error: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("Código de error: " + ex.getErrorCode());
        } finally {
            try {
            	
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException ex) {
            	ex.printStackTrace();
            }
        }

    }

	//Marta
	public    void insertEventoActividadGrupo(EventoActividadGrupo e,String direccion)
	{
		IEventoActividadGrupoDAO adao;
		
		try {
			conn.setAutoCommit(false);
			insertEvento(e,direccion);
			System.out.println("despues del insert de evento generico");
		    adao = new JDBCEventoActividadGrupoDAO(conn);
			adao.insertEventoActividadGrupo( e, oid);
			conn.commit();
		} catch (SQLException e1) {			
			try {
				conn.rollback();
			} catch (SQLException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			e1.printStackTrace();			
		}
	

	}
	//Marta
	public    void insertEventoBuscaComponentes(EventoBuscaComponentes e,String direccion)
	{
		IEventoBuscaComponentesDAO bcdao;
		try {
			conn.setAutoCommit(false);
			insertEvento(e,direccion);
		    bcdao = (IEventoBuscaComponentesDAO) new JDBCEventoBuscaComponentesDAO();
			bcdao.insertEventoBuscaComponentes( e,oid);
		} catch (SQLException e1) {
			try {
				conn.rollback();
			} catch (SQLException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			e1.printStackTrace();
		}
		
		
	}
	//Marta
	public    void insertEventoBuscaEquipo(EventoBuscaEquipo e,String direccion)
	{
		IEventoBuscaEquipoDAO bcdao;
		try {
			conn.setAutoCommit(false);
			insertEvento(e,direccion);
		    bcdao = new JDBCEventoBuscaEquipoDAO();
			bcdao.insertEventoBuscaEquipo(conn, e,oid);
		} catch (SQLException e1) {
			try {
				conn.rollback();
			} catch (SQLException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			e1.printStackTrace();
		}
	
		
	}
	
	//Miguel
	/*Obtiene la lista de eventos proximos dado un userName de un deportista*/
	public List selectEventosProximosDeportista(String userName){
		PreparedStatement stmt = null;
        ResultSet result = null;
		int log = 0;
		String sql = "SELECT * FROM eventos";
		List lE = new ArrayList();
		try {
            stmt = conn.prepareStatement(sql);
           
            result = stmt.executeQuery();
            while (result.next()) {
            	Evento ev = new Evento();
            	ev.seteventoid(result.getString("eventoid"));
            	System.out.println(ev.geteventoid());
            	ev.setTitulo(result.getString("titulo"));
            	ev.setDescripcion(result.getString("descripcion"));
            	//ev.setFecha_inicio(result.getString("fecha_inicio"));
            	//ev.setFecha_fin(result.getString("fecha_fin"));
            	ev.setCerrado(result.getInt("cerrado"));
            	ev.setGenero(result.getString("genero"));
            	System.out.println(result.getString("genero"));
            	Lugar lg = ldao.selectLugar( result.getString("lugarOID"));
            	System.out.println(lg.getDireccion());
            	ev.setLugar(lg);
            	/*List msj = mdao.selectListaMensaje(conn, result.getString("eventoid"));
            	ev.setMensajes(msj);
            	List lp = udao.selectListaPeticionesUsuario( result.getString("eventoid"));
            	List li = udao.selectListaInscritoUsuario( result.getString("eventoid"));
            	ev.setPeticiones(lp);
            	ev.setUsuarios_seleccionados(li);*/
            	ev.setCerrado(result.getInt("cerrado"));
            	System.out.println(result.getInt("cerrado"));
            	//Usuario u = udao.selectDeportistaCreador( result.getString("eventoid"));
            	//ev.setCreador(u);
            	lE.add(ev);
            }
		} catch (SQLException e){
			System.out.println ("Message" + e.getMessage());
			System.out.println ("SQLState: " + e.getSQLState());
			System.out.println ("ErrorCode: " + e.getErrorCode());
		}finally {
			try{
				if (result != null){
					result.close();
				}
				if (stmt != null){
					stmt.close();
				}
			}catch (SQLException e){
			}
		}
		return lE;
	}
	
	/*Obtiene la lista de eventos proximos dado un userName de un equipo*/
	public List selectEventosProximosEquipo(String userName){
		PreparedStatement stmt = null;
        ResultSet result = null;
		java.util.Date dActual = new Date();
		boolean log = false;
		String sql = "SELEC * FROM eventos ev  WHERE (ev.cerrado = ? ) AND (ev.fecha_inicio > ?) ";
		List lE = new ArrayList();
		try {
            stmt = conn.prepareStatement(sql);
            stmt.setBoolean(1, log);
            stmt.setDate(2, (java.sql.Date) dActual);
            result = stmt.executeQuery();
            while (result.next()) {
            	Evento ev = new Evento();
            	ev.seteventoid(result.getString("idEvento"));
            	ev.setTitulo(result.getString("titulo"));
            	ev.setDescripcion(result.getString("descripcion"));
            	ev.setFecha_inicio(result.getString("fecha_inicio"));
            	ev.setFecha_fin(result.getString("fecha_fin"));
            	ev.setCerrado(result.getInt("cerrado"));
            	ev.setGenero(result.getString("genero"));
            	Lugar lg = ldao.selectLugar(result.getString("idLugar"));
            	ev.setLugar(lg);
            	List msj = mdao.selectListaMensaje(conn, result.getString("eventoid"));
            	ev.setMensajes(msj);
            	List lp = udao.selectListaPeticionesUsuario( result.getString("eventoid"));
            	List li = udao.selectListaInscritoUsuario( result.getString("eventoid"));
            	ev.setPeticiones(lp);
            	ev.setUsuarios_seleccionados(li);
            	ev.setCerrado(result.getInt("cerrado"));
            	Usuario u = udao.selectEquipoCreador(result.getString("eventoid"));
            	ev.setCreador(u);
            	lE.add(ev);
            }
		} catch (SQLException e){
			System.out.println ("Message" + e.getMessage());
			System.out.println ("SQLState: " + e.getSQLState());
			System.out.println ("ErrorCode: " + e.getErrorCode());
		}finally {
			try{
				if (result != null){
					result.close();
				}
				if (stmt != null){
					stmt.close();
				}
			}catch (SQLException e){
			}
		}
		return lE;
	}
	
	public List selectEventosProximos(){
		return this.eventos;
	}
	
	public List selectEventosDeporteProximos(String deporte){
		return null;
	}
	
	/*Obtiene el evento por el idEvento de la BD*/
	public Evento selectEvento (String eventoid){
		PreparedStatement stmt = null;
		ResultSet result = null;
		Evento ev = null;
		String sql = "SELECT * FROM eventos WHERE (eventoid = ?)";
		
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, eventoid);
			result = stmt.executeQuery();
			
			result.next();
			ev = new Evento();
        	ev.seteventoid(result.getString("OID"));
        	ev.setTitulo(result.getString("titulo"));
        	ev.setDescripcion(result.getString("descripcion"));
        	ev.setFecha_inicio(result.getString("fecha_inicio"));
        	ev.setFecha_fin(result.getString("fecha_fin"));
        	ev.setCerrado(result.getInt("cerrado"));
        	ev.setGenero(result.getString("genero"));
        	Lugar lg = ldao.selectLugar(result.getString("idLugar"));
        	ev.setLugar(lg);
        	List msj = mdao.selectListaMensaje(conn, result.getString("eventoid"));
        	ev.setMensajes(msj);
        	List lp = udao.selectListaPeticionesUsuario( result.getString("eventoid"));
        	List li = udao.selectListaInscritoUsuario( result.getString("eventoid"));
        	ev.setPeticiones(lp);
        	ev.setUsuarios_seleccionados(li);
        	ev.setCerrado(result.getInt("cerrado"));
        	Usuario u = udao.selectEquipoCreador( result.getString("eventoid"));
        	ev.setCreador(u);
			
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		}finally {
			try {
				if (result != null){
					result.close();
				}
				if (stmt != null){
					stmt.close();
				}
			} catch (SQLException e){
			}
		}
		return ev;
	}

	public List getEventos() {
		return eventos;
	}

	public void setEventos(List eventos) {
		this.eventos = eventos;
	}

	public List getHabilidades() {
		return habilidades;
	}

	public void setHabilidades(List habilidades) {
		this.habilidades = habilidades;
	}

	public List getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List usuarios) {
		this.usuarios = usuarios;
	}
	
	public boolean addMensaje(Mensaje msj, String idEvento, String idUsuario){
		mdao = new JDBCMensajeDAO();
		return mdao.insertMensaje(conn, msj, idEvento, idUsuario);
	}

	@Override
	public void invitaconocidos(Evento e) {
		// TODO Auto-generated method stub
		
	}






}


/*List selectEventosProximos(String userName);
	List selectEventosProximos();
	List selectEventosDeporteProximos(String deporte);
	Evento selectEvento(String evento);*/

/*IEventoDAO i = new JDBCEventoDAO();
List<Evento> eventos = i.selectEventosProximos(usuario.getUserName);*/

